import axios from 'axios';
import type { AxiosInstance, AxiosResponse } from 'axios';

// 创建axios实例
const api: AxiosInstance = axios.create({
  baseURL: 'http://localhost:8081/api', // 后端API基础URL，包含上下文路径
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 从localStorage中获取token
    const token = localStorage.getItem('token');
    // 如果token存在，则添加到请求头
    if (token && config.headers) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  (response: AxiosResponse) => {
    // 直接返回响应数据
    return response.data;
  },
  (error) => {
    // 处理错误响应
    if (error.response) {
      // 请求已发出，服务器返回状态码不是 2xx
      switch (error.response.status) {
        case 401:
          // 未授权，清除token并跳转到登录页
          localStorage.removeItem('token');
          window.location.href = '/login';
          break;
        case 403:
          alert('没有权限访问该资源');
          break;
        case 404:
          alert('请求的资源不存在');
          break;
        case 500:
          alert('服务器内部错误');
          break;
        default:
          alert(`请求失败: ${error.response.data.message || '未知错误'}`);
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      alert('网络错误，请检查您的网络连接');
    } else {
      // 请求配置出错
      alert(`请求配置错误: ${error.message}`);
    }
    return Promise.reject(error);
  }
);

// 导出封装的请求方法
export default {
  get: <T = any>(url: string, params?: any) => api.get<T, T>(url, { params }),
  post: <T = any>(url: string, data?: any) => api.post<T, T>(url, data),
  put: <T = any>(url: string, data?: any) => api.put<T, T>(url, data),
  delete: <T = any>(url: string, params?: any) => api.delete<T, T>(url, { params })
};